import param from './param'
import args from './args'
import fields from './fields'

/**
 * JS 实体模板
 * @param table {Table}
 */
const JsEntity = table => {
  const {
    author,
    comment,
    date,
    names: {JavaName}
  } = table
  return `// <-
import moment from 'moment'
/** 
 * 实体：${comment} V20220301
 * @author ${author} on ${date}
 */
export default class ${JavaName} {
  /**
   * js 中， 类对象在经过方法传递后无法推断类型，造成类方法和变量提示不准确，这里 obj 转换之后可以得到正确的提示
   * @param obj {${JavaName}}
   * @return {${JavaName}}
   */
  static of(obj) {
    return new ${JavaName}(obj)
  }

  /**
   * 构造函数：内部应该列出所有可能的参数，并对参数做说明
${param(table)}
   * @param encryptId {string} 加密id
   * @param orderBy {OrderBy[]} 排序字段集合
   * @param page {Page} 分页对象
   */
  constructor({
${args(table)}
                encryptId = undefined,
                orderBy = undefined,
                page = undefined
              } = {}) {
${fields(table)}
    /**
     * 加密id
     * @type {string}
     */
    this.encryptId = encryptId
    /**
     * 排序字段集合
     * @type {OrderBy[]}
     */
    this.orderBy = orderBy
    /**
     * 分页对象
     * @type {Page}
     */
    this.page = page
  }

  toString() {
    return JSON.stringify(this)
  }

  /**
   * 清除空字符串字段，返回新对象。 前端组件输入框默认值为 "" 空字符串的情况，需要把数据类型不匹配的属性重置为 null
   * @return {${JavaName}}
   */
  clearBlankValue() {
    const obj = new ${JavaName}(JSON.parse(JSON.stringify(this)))
    ${table.clearBlankValue()}
    return obj
  }
}
`
}
export default JsEntity
